# 如何通过闭包实现装饰器 <装饰器函数> 类实现<类装饰>
# 装饰器:不修改代码的情况下进行功能扩展 装饰器 = 闭包 + 函数引用


# 多个装饰器装饰过程 遵循 就近原则
# 定义一个装饰器函数 装饰器函数需要写到普通函数的之上
# 有且需要一个参数,即需要扩展功能的函数引用
def check(f):   # 2. 即:这里的 f 是 out 函数的引用

    def inner():
        print("我是装饰器,给你增加功能")   # 5. out() 的调用即将输出的内容
        f()                             # 6. 这里的 f 便是 2中的 原out函数的引用,即执行的原out中的函数
    return inner    # 3. 闭包格式: 返回内部函数的引用


# 装饰器调用过程解析:
def out():
    print("我是[out],我想扩展一个校验功能")

out = check(out)    # 1. check 函数传入参数(out<函数引用>)
out()               # 4. 这里的 out == inner 调用out就是在调用inner


# 标准格式<语法糖>如下:
@check      # 添加装饰器
def login():
    print("我是[login],我想扩展一个校验功能")

login()
# 我是装饰器,给你增加功能
# 我是[login],我想扩展一个功能



